/*
 * Queue.h
 *
 *  Created on: 2011/06/21
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_QUEUE_H
#define INCLUDED_NTENGINE_QUEUE_H

namespace NTEngine {

/*!
 * @brief 固定長キュー。一度確保してしまえばnewしないで使える
 */
template< class T > class Queue {
public:
	/*!
	 * @brief デフォルト
	 */
	Queue();

	/*!
	 * @brief 最大容量を指定
	 */
	explicit Queue( int capacity );

	/*!
	 * @brief デストラクタ
	 */
	~Queue();

	/*!
	 * @brief 再確保（Clear呼んでからね）
	 */
	void setCapacity( int capacity );

	/*!
	 * @brief 最大容量取得
	 */
	int capacity() const;

	/*!
	 * @brief 現在の要素数取得
	 */
	int size() const;

	/*!
	 * @brief 全解放
	 */
	void clear();

	/*!
	 * @brief 末尾に空で追加。足したものへのポインタを返す
	 */
	T* pushBack();

	/*!
	 * @brief 末尾に追加
	 */
	void pushBack( const T& );

	/*!
	 * @brief 先頭を削除
	 */
	void popFront();

	/*!
	 * @brief 先頭を削除（引数で削除した要素のコピーを受け取る）
	 */
	void popFront( T* out );

	/*!
	 * @brief 先頭を取得
	 */
	const T* front() const;

	/*!
	 * @brief 先頭を取得（非const）
	 */
	T* front();

private:
	Queue( const Queue& ); // 禁止
	void operator=( const Queue& ); // 禁止

	T* mElements; //!< 要素
	int mSize; //!< 現在の要素数
	int mCapacity; //!< 容量
	int mFront; //!< 先頭のインデックス
};

} // namespace NTEngine

#include "NTEngine/Base/Impl/QueueImpl.h"

#endif // INCLUDED_NTENGINE_QUEUE_H
